/** ****************************************************************************
@defgroup RC TX
@ingroup RC_TX
@brief 遥控发送驱动
@addtogroup RC_TX
@{
*******************************************************************************/

#ifndef _RC_TX_H_
#define _RC_TX_H_

#include "nonos.h"
#include "rc_codec.h"


/// 遥控发送底层驱动打开/关闭
/// @param enable true:打开, false:关闭
/// @param freq 载波频率(Hz)。红外遥控需要指定载波频率，无线遥控不需要
/// @param duty 载波占空比(%)。红外遥控需要指定载波频率，无线遥控不需要
typedef void (*FUNC_RcTxEnable)(bool enable, uint freq, uint8_t duty);

/// 遥控发送底层驱动发射
/// @param on 是否发射
/// @param time 持续时间(us), 如果为0，则表示不计时间
typedef void (*FUNC_RcTxEmit)(bool on, uint32_t time);

/// 遥控发射器基类
typedef struct {
	/// 需要外部提供的回调函数
	/// 遥控发送底层驱动打开/关闭
	FUNC_RcTxEnable enable;
	/// 遥控发送底层驱动发射电平
	FUNC_RcTxEmit emit;

	/// 要发送的编码
	/// 要发送的编码类型
	RcCodeType codeType;
	/// 要发送的编码
	const void* code;
	/// 要重复发送的次数
	int repeatTimes;

	/// 发送过程运行时
	/// 当前是第几个脉冲
	uint16_t idx;
} driver_rctx_t;

/// @brief 初始化
/// @param dev 驱动数据结构指针
std_err_t rctx_init(driver_rctx_t* dev);

/// @brief 同步发送编码
/// @param dev 驱动数据结构指针
/// @param freq 载波频率(Hz)。红外遥控需要指定载波频率，无线遥控不需要
/// @param repeatTimes 要重复发送的次数
std_err_t rctx_send_sync(driver_rctx_t* dev, RcCodeType codeType, const void *code, uint freq, uint8_t duty, int repeatTimes);

/// @brief 异步发送编码
/// @param dev 驱动数据结构指针
/// @param freq 载波频率(Hz)。红外遥控需要指定载波频率，无线遥控不需要
/// @param repeatTimes 要重复发送的次数
std_err_t rctx_send_async(driver_rctx_t* dev, RcCodeType codeType, const void *code, uint freq, uint8_t duty, int repeatTimes);

/// @brief 当前脉冲发送完成中断处理
/// @param dev 驱动数据结构指针
void rctx_irqHandler(driver_rctx_t* dev);


#endif  // _RC_TX_H_
/// @}
